package com.baizhi.controller;

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import com.baizhi.annotation.LogAnnotation;
import com.baizhi.common.Constant;
import com.baizhi.entity.CmfzGuru;
import com.baizhi.service.CmfzGuruService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.lang.reflect.Field;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

@RestController
@RequestMapping("cmfzGuru")
public class CmfzGuruController {
    @Autowired
    private CmfzGuruService cmfzGuruService;
    @RequestMapping("show")
    @LogAnnotation(content = "查询上师信息",type = "查询")
    public Map showGuru(Integer page,Integer limit,String guruNickname){
        Map map = new HashMap();
        Page<CmfzGuru> guruPage = cmfzGuruService.selectPage(page, limit, guruNickname);
        map.put("code",0);
        map.put("msg","");
        map.put("count",guruPage.getTotal());
        map.put("data",guruPage.getRecords());
        return map;
    }
    @RequestMapping("upload")
    @LogAnnotation(content = "上传上师头像",type = "上传")
    public Map upload(MultipartFile file){
        Map map = new HashMap();
        String fileName = file.getOriginalFilename();
        String newFileName = UUID.randomUUID().toString()+fileName;
        try {
            file.transferTo(new File(Constant.GURU_IMG_LOCATION,newFileName));
            map.put("fileName",newFileName);
            map.put("flag",true);
        } catch (IOException e) {
            map.put("flag",false);
        }
        return map;
    }
    @RequestMapping("add")
    @LogAnnotation(content = "添加上师数据",type = "添加")
    public Map addGuru(CmfzGuru cmfzGuru){
        Map map = new HashMap();
        try {
            cmfzGuruService.insertCmfzGuru(cmfzGuru);
            map.put("flag",true);
        } catch (Exception e) {
            map.put("flag",false);
        }
        return map;
    }
    @RequestMapping("update")
    @LogAnnotation(content = "更新上师数据",type = "修改")
    public Map updateGuru(Integer guruId){
        Map map = new HashMap();
        try {
            cmfzGuruService.updateCmfzGuru(guruId);
            map.put("flag",true);
        } catch (Exception e) {
            map.put("flag",false);
        }
        return map;
    }
    @RequestMapping("importByPoi")//使用原生POI进行文件导入
    @LogAnnotation(content = "原生POI批量添加上师数据",type = "上传")
    public Map importFile(MultipartFile file){
        Map map = new HashMap();
        try {
            //1、根据参数 上传的Excel文件  获取一个输入流对象
            InputStream inputStream = file.getInputStream();
            //2、根据poi解析该输入流对象  获取一个Excel对象
            HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
            //3、获取该Excel对象中的表对象
            HSSFSheet sheet = workbook.getSheetAt(0);
            //4、获取表中的最后一行的下标  然后遍历表中的每一行（从第二行到最后一行）
            int lastRowNum = sheet.getLastRowNum();
            for (int i = 1; i <=lastRowNum ; i++) {
                //4.1 获取每一行的行对象  row
                HSSFRow row = sheet.getRow(i);
                //4.2 获取该行内的每一个单元格对象  并获取其内的数据
                String id = row.getCell(0).getStringCellValue();
                String name = row.getCell(1).getStringCellValue();
                String img = row.getCell(2).getStringCellValue();
                String nickname = row.getCell(3).getStringCellValue();
                String status = row.getCell(4).getStringCellValue();
                //4.3  将上面的数据  封装到对象的对应的属性中  id封不封都行 因为添加操作时ID是自增的  用不到
                CmfzGuru cmfzGuru = new CmfzGuru();
                cmfzGuru.setGuruName(name);
                cmfzGuru.setGuruImage(img);
                cmfzGuru.setGuruNickname(nickname);
                cmfzGuru.setGuruStatus(Integer.parseInt(status));
                //4.4  执行添加操作
                cmfzGuruService.insertCmfzGuru(cmfzGuru);
            }
            map.put("flag",true);
        } catch (IOException e) {
            map.put("flag",false);
        }
        return map;
    }

    @RequestMapping("importFile")//使用EasyPoi进行文件导入
    @LogAnnotation(content = "EasyPoi批量添加上师数据",type = "上传")
    public Map importByEasyPoi(MultipartFile file){
        Map map = new HashMap();
        try {
//        0、准备导入文件输入流对象
            InputStream inputStream = file.getInputStream();
//        1、准备导入参数对象
            ImportParams importParams = new ImportParams();
            importParams.setHeadRows(1);//准备上传的Excel文件有一行表头数据 这里指明了就不会当作真实数据导入数据库
//        2、调用导入工具类的导入方法进行导入操作
            List<CmfzGuru> cmfzGurus = ExcelImportUtil.importExcel(inputStream, CmfzGuru.class, importParams);
            for (CmfzGuru cmfzGuru : cmfzGurus) {
                cmfzGuruService.insertCmfzGuru(cmfzGuru);
            }
            map.put("flag",true);
        } catch (Exception e) {
            map.put("flag",false);
        }
        return map;
    }

    @RequestMapping("downByPoi")//使用原生POI进行文件导出
    @LogAnnotation(content = "原生POI批量下载上师数据",type = "下载")
    public Map downLoads(HttpServletResponse response){
        Map map = new HashMap();
        try {
            //1、获取要下载的数据
            List<CmfzGuru> list = cmfzGuruService.selectAll();
            String[] head = {"上师编号","上师姓名","上师头像","上师昵称","上师状态"};
            //2、准备一个Excel表格对象  使用POI
            HSSFWorkbook workbook = new HSSFWorkbook();
            //3、创建该文档中的一个表对象sheet  记得起个表名
            HSSFSheet sheet = workbook.createSheet("guru3");
            //4、创建该表的第一行对象  然后遍历表头数组 将每一元素放进对应的单元格内
            HSSFRow row = sheet.createRow(0);
            for (int i = 0; i < head.length; i++) {
                HSSFCell cell = row.createCell(i);//获取每一个单元格对象
                cell.setCellValue(head[i]);//将数组中的每一个元素  写进对应的单元格内
            }
            //5、遍历上师数据集合
            for (int i = 0; i < list.size(); i++) {
        //A、创建每一行的对象row   从第二行开始
        HSSFRow row1 = sheet.createRow(i + 1);
        //B、获取当前遍历的上师对象
        CmfzGuru guru = list.get(i);
        //C、利用反射  获取当前对象的类对象
        Class<? extends CmfzGuru> guruClass = guru.getClass();
        //D、根据类对象 获取该对象中所有的属性对象  组成的数组
        Field[] fields = guruClass.getDeclaredFields();
        //E、遍历整个属性对象组成的数组   获取每一个属性对象
        for (int j = 0; j < fields.length; j++) {
            Field field = fields[j];
            //F、设置开启私有属性的访问权限
            field.setAccessible(true);
            //G、根据属性对象的get（类的对象）方法  获取该属性的值
            Object obj = field.get(guru);
            //H、根据属性对象数组（字段、列）循环创建单元格对象  每个单元格内保存对应的属性值数据
            HSSFCell cell = row1.createCell(j);
            //I、将该属性值  保存到刚刚创建好的单元格内
            cell.setCellValue(obj.toString());

        }
    }
    //6、文件下载
//            workbook.write(new FileOutputStream(Constant.FILE_DOWN_LOCATION+"\\guru3.xls"));

    //设置响应头信息  将下载后的文件名设置进去
    //其中第一参数表示设置的是name属性  content-disposition表示
    //第二个参数数value  attachment  表示以“附件的形式下载响应”
    //				filename= 表示下载后的文件名字，utf-8防止文件名有中文乱码
            response.setHeader("content-disposition","attachment;filename="+
                    URLEncoder.encode("guru3.xls","utf-8"));
            response.setContentType("application/vnd.ms-excel");
    //通过文件对象写出
            workbook.write(response.getOutputStream());
            map.put("flag",true);
} catch (Exception e) {
        map.put("flag",false);
        }
        return map;
        }
        @RequestMapping("downLoads")//使用EasyPoi进行文件导出  即下载
        @LogAnnotation(content = "EasyPoi批量下载上师数据",type = "下载")
        public void exportByEasyPoi(HttpServletResponse response) {
//            1、使用easypoi注解@Excel标注要操作的数据对应的实体类属性
//            2、使用导出工具类进行相关操作
          /* A、准备导出参数对象  用来设置导出的Excel表格的标题和表名
            构造方法或set方法都可以采用  前者必须设置两个参数 后者可以只设置表名即可
            ExportParams exportParams = new ExportParams("所有上师数据","easyPoi_guru");
            */
            ExportParams exportParams = new ExportParams();
            exportParams.setSheetName("guru-easypoi");//设置表名
//            exportParams.setTitle("所有上师数据");//设置标题行   该行也不可以不设置
//          B、准备要导出的具体数据  从数据库查询
            List<CmfzGuru> cmfzGurus = cmfzGuruService.selectAll();
//          C、调用导出工具类的导出方法  执行文件导出操作
            Workbook workbook = ExcelExportUtil.exportExcel(exportParams, CmfzGuru.class, cmfzGurus);
//          3、执行浏览器文件下载的设置
            try {
                response.setHeader("content-disposition","attachment;filename="+
                        URLEncoder.encode("guru-easypoi.xls","utf-8"));
                response.setContentType("application/vnd.ms-excel");
                //通过文件对象写出
                workbook.write(response.getOutputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
}
